﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CANO.Data;

namespace CANO.Data.DAOs
{
	public class UsuarioDAO
	{
		public int UsuarioID { get; set; }
		public int? Zona { get; set; }
		public int Rol { get; set; }
		public string TelefonoPersonal { get; set; }
		public string TelefonoLaboral { get; set; }
		public string Mail { get; set; }
		public string FotoPerfil { get; set; }
		public string Direccion { get; set; }
		public DateTime? FechaNacimiento { get; set; }
		public string UserName { get; set; }
		public string Password { get; set; }
		public string Nombre { get; set; }
		public string Apellido { get; set; }
		public string FullName { get; set; }
		public string RolDesc { get; set; }
		public int Status { get; set; }

		public static string getUserNameByID(int id)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					from u in context.Usuarios
					where u.UsuarioID == id
					select u;
				string retVal = user.SingleOrDefault().Nombre +", "+user.SingleOrDefault().Apellido;
				return retVal;
			}
		}

		public UsuarioDAO getUser(int id)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					from u in context.Usuarios
					where u.UsuarioID == id
					select u;

				UsuarioDAO usuario = new UsuarioDAO();
				fillProperties(usuario, user.SingleOrDefault());

				return usuario;
			}
		}

		public static List<UsuarioDAO> getAll()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var users =
					from u in context.Usuarios
					where u.Status == null
					select u;

				List<UsuarioDAO> listUsuarios = new List<UsuarioDAO>();
				foreach (var item in users)
				{
					UsuarioDAO retUser = new UsuarioDAO();
					fillProperties(retUser, item);
					listUsuarios.Add(retUser);
				}
				return listUsuarios;
			}
		}

		public bool ValidateUser(string userName, string password)
		{
		using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					(from u in context.Usuarios
					where u.UserName == userName && u.Password == password && u.Status == null
					select u);

					if(user.Count() != 0)
					{
						return true;
					}

			return false;
			}
		}

		public int getRolByUser(string userName)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					(from u in context.Usuarios
					 where u.UserName == userName
					 select u);

				return user.Single().Rol;
			}
		}
		
		public string GetNameByID(int UserID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					(from u in context.Usuarios
					 where u.UsuarioID == UserID
					 select u);

				return user.Single().Nombre;
			}
		}

		//Support Methods
		private static void fillProperties(UsuarioDAO usuarioDAO, CANO.Data.Usuario usuario)
		{
			usuarioDAO.UsuarioID = usuario.UsuarioID;
			usuarioDAO.Zona = usuario.Zona;
			usuarioDAO.Rol = usuario.Rol;
			usuarioDAO.TelefonoPersonal = usuario.TelefonoPersonal;
			usuarioDAO.TelefonoLaboral = usuario.TelefonoLaboral;
			usuarioDAO.Mail = usuario.Mail;
			usuarioDAO.FotoPerfil = usuario.FotoPerfil;
			usuarioDAO.Direccion = usuario.Direccion;
			usuarioDAO.FechaNacimiento = usuario.FechaNacimiento;
			usuarioDAO.UserName = usuario.UserName;
			usuarioDAO.Password = usuario.Password;
			usuarioDAO.Nombre = usuario.Nombre;
			usuarioDAO.Apellido = usuario.Apellido;
			usuarioDAO.FullName = usuario.Apellido + ", " + usuario.Nombre;
			usuarioDAO.RolDesc = usuario.Rol1.Rol1;
			if (usuario.Status.HasValue)
				usuarioDAO.Status = usuario.Status.Value;
		}
		
		public static bool currentUserIsAdmin(string currentUserName)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					(from u in context.Usuarios
					 where u.UserName == currentUserName
					 select u);
				if(user.Single().Rol == 1) //ToDo: Enums ROLS
					return true;
				return false;
			}
		}

		public static object getAllAsignaciones()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var users =
					from u in context.Usuarios
					where u.Status == null
					select u;

				List<UsuarioDAO> listUsuarios = new List<UsuarioDAO>();
				foreach (var item in users)
				{
					UsuarioDAO retUser = new UsuarioDAO();
					fillProperties(retUser, item);
					listUsuarios.Add(retUser);
				}
				return listUsuarios;
			}
		}

		public int Create()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				CANO.Data.Usuario newUsuario = new CANO.Data.Usuario();
				FillUsuario(newUsuario);

				context.Usuarios.InsertOnSubmit(newUsuario);
				context.SubmitChanges();

				return newUsuario.UsuarioID;
			}
		}

		private void FillUsuario(CANO.Data.Usuario newUsuario)
		{
			newUsuario.Zona = this.Zona;
			newUsuario.Rol = this.Rol;
			newUsuario.TelefonoPersonal = this.TelefonoPersonal;
			newUsuario.TelefonoLaboral = this.TelefonoLaboral;
			newUsuario.Mail = this.Mail;
			newUsuario.FotoPerfil = this.FotoPerfil;
			newUsuario.Direccion = this.Direccion;
			newUsuario.FechaNacimiento = this.FechaNacimiento;
			newUsuario.UserName = this.UserName;
			newUsuario.Password = this.Password;
			newUsuario.Nombre = this.Nombre;
			newUsuario.Apellido = this.Apellido;
			newUsuario.Status = null;
		}

		public void Update()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var updateUser =
					(from u in context.Usuarios
					 where u.UsuarioID == this.UsuarioID
					 select u).Single();

				FillUsuario(updateUser);

				context.SubmitChanges();
			}
		}

		public int GetUserIDByUser(string User)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var user =
					(from u in context.Usuarios
					 where u.UserName == User
					 select u);

				return user.Single().UsuarioID;
			}
		}

		public static void Delete(int UserID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var client =
					(from c in context.Usuarios
					 where c.UsuarioID == UserID
					 select c).Single();

				client.Status = 1; //Delete

				context.SubmitChanges();
			}
		}
	}

}
